#ifndef THREAD3_H
#define THREAD3_H

#include <pthread.h>
#include <stdint.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include "log_utils.h"

// CAN设备定义
#define CAN_DEVICE "can0"  // CAN设备名称，可通过宏定义修改为CAN1

// CAN波特率定义
#define CAN_BITRATE 1000000  // 1Mbps，与E-UAVCAN协议一致

// E-UAVCAN协议ID定义
#define BATTERY_MSG_TYPE_ID 0x1092     // 电池主动上报信息ID，参见协议文档
#define BMS_NODE_ID        0x16        // BMS默认Node ID为0x16

// 构建E-UAVCAN协议的完整CAN ID
// 格式: [Priority(3bit)][Message type ID(16bit)][Service or message(1bit)][Source node ID(7bit)][Destination Node Id(7bit)]
#define PRIORITY_NORMAL    (0x01 << 26)  // 普通优先级
#define EUAVCAN_MESSAGE    (0x00 << 9)   // 消息标志，0表示消息
#define SOURCE_NODE_BMS    (BMS_NODE_ID << 7)  // 源节点为BMS
#define DEST_NODE_ALL      (0x00)       // 目标节点为0，表示广播

// E-UAVCAN 电池消息ID
// 完整ID为优先级(3位) + 消息类型(16位) + 服务或消息标志(1位) + 源节点ID(7位) + 目标节点ID(7位)
#define BATTERY_INFO_CAN_ID  (PRIORITY_NORMAL | (BATTERY_MSG_TYPE_ID << 10) | EUAVCAN_MESSAGE | SOURCE_NODE_BMS | DEST_NODE_ALL)

// 错误状态位定义
#define ERR_CELL_OVERVOLTAGE    (1 << 0)   // 单体过压
#define ERR_CELL_UNDERVOLTAGE   (1 << 1)   // 单体欠压
#define ERR_PACK_OVERVOLTAGE    (1 << 2)   // 总压过压
#define ERR_PACK_UNDERVOLTAGE   (1 << 3)   // 总压欠压
#define ERR_CHARGE_OVERTEMP     (1 << 4)   // 充电过温
#define ERR_CHARGE_UNDERTEMP    (1 << 5)   // 充电低温
#define ERR_DISCHARGE_OVERTEMP  (1 << 6)   // 放电过温
#define ERR_DISCHARGE_UNDERTEMP (1 << 7)   // 放电低温
#define ERR_CHARGE_OVERCURRENT  (1 << 8)   // 充电过流
#define ERR_DISCHARGE_OVERCURRENT (1 << 9) // 放电过流
#define ERR_SHORT_CIRCUIT       (1 << 10)  // 短路
#define ERR_FRONT_END_DETECT    (1 << 11)  // 前端检测
#define ERR_MOS_OVERTEMP        (1 << 12)  // MOS过温

// 多帧传输状态枚举
typedef enum {
    TRANSFER_IDLE = 0,       // 空闲状态，等待新传输
    TRANSFER_IN_PROGRESS,    // 传输进行中
    TRANSFER_COMPLETE,       // 传输完成
    TRANSFER_ERROR           // 传输错误
} transfer_state_t;

// 电源信息结构体，根据E-UAVCAN协议
typedef struct {
    // 基本信息
    uint16_t manufacturer_id;        // 厂商编号
    uint16_t battery_type;           // 电池型号编码
    uint16_t total_voltage;          // 电池电压，单位(mV)
    int16_t current;                 // 充放电电流，单位(10mA)，正为充电，负为放电
    int16_t temperature;             // 电池温度，单位(0.1℃)
    uint16_t remaining_capacity;     // 电量百分比，单位(%)
    uint16_t cycles;                 // 循环次数
    uint16_t health_status;          // 健康状况，单位(%)
    
    // 单体电压，单位(mV)
    uint16_t cell_voltages[14];      // 单体电压，最多14节
    uint16_t cell_count;             // 实际单体数量
    
    // 设计容量和剩余容量
    uint16_t design_capacity;        // 电池设计容量，单位(mAh)
    uint16_t remain_capacity;        // 电池剩余容量，单位(mAh)
    
    // 错误状态
    uint32_t error_flags;            // 错误标志
    
    // 电池序列号
    char serial_number[16];          // 电池序列号
    
    // 系统添加的字段
    uint32_t timestamp;              // 时间戳（系统添加）
    uint8_t data_valid;              // 数据是否有效的标志
    uint8_t multi_frame_transfer;    // 是否是多帧传输
    
    // 传输控制相关
    uint8_t transfer_id;             // 传输ID (0-31)
    uint8_t start_of_transfer;       // 传输开始标志
    uint8_t end_of_transfer;         // 传输结束标志
    uint8_t toggle_bit;              // 多帧传输的切换位
    
    // CRC校验值（多帧传输使用）
    uint16_t crc;                    // 多帧传输的CRC校验值
} power_info_t;

// 全局变量声明
extern power_info_t g_power_info;
extern pthread_mutex_t g_power_info_mutex;

// 线程3函数声明
void *thread3_function(void *arg);

// 获取电源信息的函数
int get_power_info(power_info_t *info);

// 检查特定错误是否存在
int check_battery_error(uint32_t error_flag);

// 初始化CAN接口
int init_can_interface(void);

// 发送CAN消息的辅助函数
int send_can_frame(int socket, uint32_t can_id, uint8_t *data, uint8_t len);

#endif /* THREAD3_H */ 